﻿using Pe.Petecos.Comercial.Aplicacion.Core.Base;
using Pe.Petecos.Comercial.Aplicacion.Core.ServiceContract;
using Pe.Petecos.Comercial.Aplicacion.TransferObject.Ventas;
using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Presentacion.Core.Controllers.Base;
using Pe.Petecos.Comercial.Presentacion.Core.Security;
using Pe.Petecos.Comercial.Presentacion.Core.ViewModel.Ventas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace Pe.Petecos.Comercial.Presentacion.Core.Controllers.Ventas
{
    public class AdministrarEventoController : GenericController
    {
        public IGeneralService generalService { get; set; }
        public IVentasService ventasService { get; set; }

        #region Action
        /// /// <summary>
        /// Muestra la vista principal
        /// </summary>
        /// <returns>Vista principal de la opción</returns>
        public ActionResult Index()
        {
            var result = generalService.BuscarOpcion(DatosConstantes.Parametro.EstadoEvento).Result;
            var model = new AdministrarEventoBusquedaModel(result);

            return View(model);
        }

        #endregion

        #region Vistas Parciales
        /// <summary>
        /// Muestra el formulario de datos
        /// </summary>
        /// <returns>Vista FormularioRegistro</returns>
        public ActionResult FormularioRegistro(int codigo)
        {
            var tiposEvento = generalService.BuscarOpcion(DatosConstantes.Parametro.TipoEvento).Result;
            var monedas = generalService.BuscarOpcion(DatosConstantes.Parametro.Moneda).Result;
            var modelo = new AdministrarEventoRegistroModel(tiposEvento, monedas);
            var currentAccount = HttpSessionContext.CurrentAccount();
            ViewBag.Perfil = currentAccount.CodigoPerfil;

            if (codigo > 0)
            {
                var evento = ventasService.ObtenerEvento(codigo).Result;
                modelo.Evento = evento;
            }

            return View(modelo);
        }

        #endregion

        #region Json

        public JsonResult Buscar(FiltroEvento filtro)
        {
            var resultado = ventasService.BuscarEvento(filtro);
            return Json(resultado);
        }

        public JsonResult Registrar(DataEvento evento)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();
            evento.UsuarioCreacion = currentAccount.Cuenta;
            evento.UsuarioModificacion = currentAccount.Cuenta;

            var resultado = ventasService.RegistrarEvento(evento);
            return Json(resultado);
        }

        public JsonResult Anular(List<int> codigos)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();

            var resultado = ventasService.ModificarEstadoEvento(codigos, DatosConstantes.EstadoEvento.Eliminado, currentAccount.Cuenta);
            return Json(resultado);
        }

        public JsonResult PreAprobar(List<int> codigos)
        {
            ProcessResult<List<int>> resultado = new ProcessResult<List<int>>();

            var currentAccount = HttpSessionContext.CurrentAccount();
            resultado = ventasService.ModificarEstadoEvento(codigos, DatosConstantes.EstadoEvento.PreAprobado, currentAccount.Cuenta);

            //if (currentAccount.CodigoPerfil == DatosConstantes.Perfil.Administrador || currentAccount.CodigoPerfil == DatosConstantes.Perfil.PreAprobador)
            //{
            //    resultado = ventasService.ModificarEstadoEvento(codigos, DatosConstantes.EstadoEvento.PreAprobado, currentAccount.Cuenta);
            //}
            //else
            //{
            //    resultado.CodeResult = -1;
            //

            return Json(resultado);
        }

        public JsonResult Aprobar(List<int> codigos)
        {

            ProcessResult<List<int>> resultado = new ProcessResult<List<int>>();

            var currentAccount = HttpSessionContext.CurrentAccount();
            resultado = ventasService.ModificarEstadoEvento(codigos, DatosConstantes.EstadoEvento.Aprobado, currentAccount.Cuenta);

            //if (currentAccount.CodigoPerfil == DatosConstantes.Perfil.Administrador || currentAccount.CodigoPerfil == DatosConstantes.Perfil.Aprobador)
            //{
            //    resultado = ventasService.ModificarEstadoEvento(codigos, DatosConstantes.EstadoEvento.Aprobado, currentAccount.Cuenta);
            //}
            //else
            //{
            //    resultado.CodeResult = -1;
            //}

            return Json(resultado);
        }

        public JsonResult Aceptar(List<int> codigos)
        {

            ProcessResult<List<int>> resultado = new ProcessResult<List<int>>();

            var currentAccount = HttpSessionContext.CurrentAccount();
            resultado = ventasService.ModificarEstadoEvento(codigos, DatosConstantes.EstadoEvento.Aceptado, currentAccount.Cuenta);

            //if (currentAccount.CodigoPerfil == DatosConstantes.Perfil.Administrador)
            //{
            //    resultado = ventasService.ModificarEstadoEvento(codigos, DatosConstantes.EstadoEvento.Aceptado, currentAccount.Cuenta);
            //}
            //else
            //{
            //    resultado.CodeResult = -1;
            //}

            return Json(resultado);
        }

        public JsonResult Copiar(int codigo)
        {
            var currentAccount = HttpSessionContext.CurrentAccount();
            var cuenta = currentAccount.Cuenta;
            var resultado = ventasService.CopiarEvento(codigo, cuenta);
            return Json(resultado);
        }

        #endregion

        #region File
        public FileResult Exportar(int codigo)
        {
            var archivo = ventasService.GenerarDocumentoEvento(codigo, "EXCELOPENXML");
            var nombre = "presupuesto" + DateTime.Now.ToString("_ddMMyyyy_hhmmss") + ".xlsx";
            return File(archivo.Result, System.Net.Mime.MediaTypeNames.Application.Octet, nombre);
        }
        #endregion
    }
}
